#include <stdlib.h>
#include <stdio.h>

#include "builtin.h"
#include "parse.h"
#include "externs.h"

// 设计 函数指针类型
typedef void(*CMD_HANDLER)(void);
// void(*CMD_HANDLER)(void)  就是函数指针类型
// void(*CMD_HANDLER)(void) a;  声明了一个叫做 a 的 void(*CMD_HANDLER)(void) 类型变量
// void(*CMD_HANDLER)(void) --> CMD_HANDLER
// CMD_HANDLER a;  此时 a 天生就是一个指针，且是一个只能指向函数的指针
// a 只能指向一个 没有返回值，且没有参数的函数

typedef struct builtin_cmd {
    char* name;
    CMD_HANDLER handler;   // handler 指针类型的变量中，只能保存一个 函数的地址
} BUILTIN_CMD;


void do_exit(void);
void do_cd(void);
void do_type(void);
void do_fg(void);

BUILTIN_CMD builtins[] = {
                            {"exit", do_exit},
                            {"cd",   do_cd},
                            {"type", do_type},
                            {"fg",   do_fg},
                            {NULL, NULL}
                        };

/*
 * 内部命令解析
 * 返回1表示为内部命令，0表示不是内部命令
 */
int builtin(void) {
    /*
    if (check("exit"))
        do_exit();
    else if (check("cd"))
        do_cd();
    else
        return 0;

    return 1;
    */

    int i = 0;
    int found = 0;
    while (builtins[i].name != NULL) {
        if (check(builtins[i].name)) {
            builtins[i].handler();
            found = 1;
            break;
        }
        i++;
    }

    return found;
}

void do_exit(void) {
    printf("exit\n");
    exit(EXIT_SUCCESS);
}

void do_cd(void) {
    printf("do_cd ... \n");
}

void do_type(void) {
    printf("do_type ... \n");
}

void do_fg(void) {
    printf("do_fg ... \n");
}
